from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
from langchain_core.output_parsers import PydanticOutputParser, JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate

#定义模型
mode = ChatOpenAI(model_name="qwen-plus",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-4f1498f1c0314ba79ea2919bd7a02c4d",
    temperature=0.7
)

#定义模型
class UserInfo(BaseModel):
    name: str = Field(description="用户姓名")
    age: int = Field(description="用户年龄", gt=0)
    hobbies: list[str] = Field(description="兴趣爱好列表")

# Step2：创建解析器
parser = PydanticOutputParser(pydantic_object=UserInfo)

# Step3：构建提示模板


prompt = ChatPromptTemplate.from_template("""
你是一个文本助手，提取用户信息:{input},
必须遵守格式：{format_instructions}
""")

prompt = prompt.partial(format_instructions=parser.get_format_instructions()) #约束返回对应格式


#组合
chain = prompt | mode | parser

response  = chain.invoke({"input":"我的名称是老王,今年-1岁,喜欢看电影,打篮球，和写代码,下午要去看老师"})

print(response)
print(type(response))
print(response.model_dump())
print(response.json())


#案例二

#定义json结果
# class SentimentResult(BaseModel):
#     sentiment: str
#     confidence:float
#     keywords:list[str]
#
# #构建处理器
# parser = JsonOutputParser(pydantic_object=SentimentResult)
# prompt = ChatPromptTemplate.from_template("""
# 分析评论情感:{input}
# confidence字段为评分，评分区间[0-100]分，最差为0分，最优为100分
# 以英文形式按以下JSON格式返回：
# {format_instructions}
# """).partial(format_instructions=parser.get_format_instructions())
#
# chain = prompt | mode | parser
#
# #执行分析
# # result = chain.invoke({"input":"物流很慢，包装严重破损"})
# # result = chain.invoke({"input":"物流快，包装轻微破损"})
# # print(result)
#
# for chum in chain.stream({"input":"物流很快，包装精美"}):
#     print(chum)